/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package gestInt.controlador;

import gestInt.DAO.AdministrativoJpaController;
import gestInt.DAO.EstudianteJpaController;
import gestInt.DAO.PersonaJpaController;
import gestInt.DAO.ProfesorJpaController;
import gestInt.DAO.UsuarioJpaController;
import gestInt.DAO.exceptions.RollbackFailureException;
import gestInt.modelo.Administrativo;
import gestInt.modelo.Estudiante;
import gestInt.modelo.Persona;
import gestInt.modelo.Profesor;
import gestInt.modelo.Usuario;
import java.io.IOException;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.transaction.UserTransaction;

/**
 *
 * @author elkin
 */
@Named(value = "usuarioManagedBean")
@SessionScoped
public class UsuarioManagedBean implements Serializable {

        @Resource
    private UserTransaction utx;

    private Persona objPersona;
    private Usuario objUsuario;
    private Administrativo objAdministrativo;
    private Profesor objProfesor;
    private Estudiante objEstudiante;
    private final PersonaJpaController jpaPersona;
    private final UsuarioJpaController jpaUsuario;
    private final AdministrativoJpaController jpaAdministrativo;
    private final ProfesorJpaController jpaProfesor;
    private final EstudianteJpaController jpaEstudiante;
    private final List<Persona> lstPersonas;
    private final List<Administrativo> lstAdministrativos;
    private final List<Usuario> lstUsuarios;
    private final List<Profesor> lstProfesores;
    private final List<Estudiante> lstEstudiantes;

    private boolean sesionIniciada;
    private boolean existePersona;
    private String rePassword;
    private Integer idPersona;
    private String rol;
    /**
     * Creates a new instance of UsuarioManagedBean
     */
    public UsuarioManagedBean() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("GestIntPU");
        this.objPersona = new Persona();
        this.objUsuario = new Usuario();
        this.objAdministrativo = new Administrativo();
        this.objProfesor = new Profesor();
        this.objEstudiante = new Estudiante();
        this.jpaPersona = new PersonaJpaController(utx, emf);
        this.jpaUsuario = new UsuarioJpaController(utx, emf);
        this.jpaAdministrativo = new AdministrativoJpaController(utx, emf);
        this.jpaProfesor = new ProfesorJpaController(utx, emf);
        this.jpaEstudiante = new EstudianteJpaController(utx, emf);
        this.lstUsuarios = this.jpaUsuario.findUsuarioEntities();
        this.lstPersonas = this.jpaPersona.findPersonaEntities();
        //this.lstAdministrativos = this.jpaAdministrativo.findAdministrativoEntities();
        this.lstProfesores = this.jpaProfesor.findProfesorEntities();
        this.lstEstudiantes = this.jpaEstudiante.findEstudianteEntities();
        this.lstAdministrativos = null;

        this.existePersona = false;
        this.sesionIniciada = false;
        this.rePassword = new String();
        this.idPersona = 0;
    }
    
    public void registrarUsuario() {

        Persona nuevoUsuario = new Persona();
        if (this.objUsuario.getRol().equals("invitado")) {
            for (Persona persona : lstPersonas) {
                int codPersona = persona.getIdpersona();
                if (codPersona == this.idPersona) {
                    nuevoUsuario = persona;
                    this.objUsuario.setPersona(nuevoUsuario);
                    this.existePersona = true;
                }
            }
        }

        if (this.objUsuario.getRol().equals("profesor")) {
            for (Profesor profesor : lstProfesores) {
                int codProfesor = profesor.getPersona().getIdpersona();
                if (codProfesor == this.idPersona) {
                    nuevoUsuario = profesor.getPersona();
                    this.objUsuario.setPersona(nuevoUsuario);
                    this.existePersona = true;
                }
            }
        }

        if (this.objUsuario.getRol().equals("administrativo")) {
            for (Administrativo administrativo : lstAdministrativos) {
                int codAdministrativo = administrativo.getPersona().getIdpersona();
                if (codAdministrativo == this.idPersona) {
                    nuevoUsuario = administrativo.getPersona();
                    this.objUsuario.setPersona(nuevoUsuario);
                    this.existePersona = true;
                }
            }
        }

        if (this.objUsuario.getRol().equals("Estudiante")) {
            for (Estudiante estudiante : lstEstudiantes) {
                int codEstudiante = estudiante.getPersona().getIdpersona();
                if (codEstudiante == this.idPersona) {
                    nuevoUsuario = estudiante.getPersona();
                    this.objUsuario.setPersona(nuevoUsuario);
                    this.existePersona = true;
                }
            }
        }

        if (this.existePersona) {
            try {
                this.jpaUsuario.create(objUsuario);
            } catch (RollbackFailureException ex) {
                Logger.getLogger(UsuarioManagedBean.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(UsuarioManagedBean.class.getName()).log(Level.SEVERE, null, ex);
            }
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Registro exitoso", null));
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "El ID ingresado no se encuentra registrado", null));
        }

    }

    public void iniciarSesion() throws IOException {

        FacesContext context = FacesContext.getCurrentInstance();

        for (Usuario usuario : lstUsuarios) {//recorro la lista de todos los usuarios
            if (usuario.getLogin().equals(this.objUsuario.getLogin()) && usuario.getPassword().equals(this.objUsuario.getPassword())) { //verifico pass y login en la lista
                this.sesionIniciada = true;
                context.addMessage("error", new FacesMessage("esta iniciando sesion"));
                context.getExternalContext().getSessionMap().put("login", this.objUsuario.getLogin());
                context.getExternalContext().getSessionMap().put("password", this.objUsuario.getPassword());//almaceno en una variable de sesion
                context.getExternalContext().getSessionMap().put("activo", this.sesionIniciada);
                this.objUsuario.setRol(usuario.getRol());
                context.getExternalContext().getSessionMap().put("rol", usuario.getRol());
                //NombreBeanEnSesion nombreBeanEnSesion = (NombreBeanEnSesion) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("NombreBeanEnSesion"); //sacar algo
            }
        }

        if (this.sesionIniciada) {
            if (this.objUsuario.getRol().equals("profesor")) {
                this.setRol("Profesor");
                context.getExternalContext().redirect("IndexProfesor.xhtml");
            }

            if (this.objUsuario.getRol().equals("admin")) {
                this.setRol("Admin");
                FacesContext.getCurrentInstance().getExternalContext().redirect("IndexAdministrador.xhtml");
            }

            if (this.objUsuario.getRol().equals("estudiante")) {
                this.setRol("Estudiante");
                FacesContext.getCurrentInstance().getExternalContext().redirect("IndexEstudiante.xhtml");
            }

            if (this.objUsuario.getRol().equals("administrativo")) {
                this.setRol("Administrativo");
                FacesContext.getCurrentInstance().getExternalContext().redirect("IndexAdministrativo.xhtml");
            }

        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,
                    "Datos Incorrectos", null));
        }
    }

    public void cerrarSesion() throws IOException {
        this.sesionIniciada = false;
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("login", "");
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("password", "");//almaceno en una variable de sesion
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("activo", "");
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("rol", "");
        this.limpiarObjUsuario();
        //FacesContext context = FacesContext.getCurrentInstance();
        //context.getExternalContext().getSessionMap().remove("NombreBeanEnSesion");// eliminar todo
        FacesContext.getCurrentInstance().getExternalContext().redirect("/GestInt/faces/usuario/IniciarSesion.xhtml");
    }

    public void limpiarObjUsuario() {

        this.objUsuario.setLogin("");
        this.objUsuario.setPassword("");
    }

    public String getRePassword() {
        return rePassword;
    }

    public void setRePassword(String rePassword) {
        this.rePassword = rePassword;
    }

    public Usuario getObjUsuario() {
        return objUsuario;
    }

    public void setObjUsuario(Usuario objUsuario) {
        this.objUsuario = objUsuario;
    }

    public Integer getIdPersona() {
        return idPersona;
    }

    public void setIdPersona(Integer idPersona) {
        this.idPersona = idPersona;
    }

    public boolean isSesionIniciada() {
        return sesionIniciada;
    }

    public void setSesionIniciada(boolean sesionIniciada) {
        this.sesionIniciada = sesionIniciada;
    }

    public String getRol() {
        return rol;
    }

    public void setRol(String rol) {
        this.rol = rol;
    }
    
}
